package org.snail.employee.mapper;

import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.session.RowBounds;
import org.snail.employee.bean.*;
import org.springframework.stereotype.Repository;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Repository
//TODO 是否需要在将mapper封装一下，这样可以打印try---catch
public interface EmployeesMapper {

    /**
     * 将基础Excel表插入到主表中
     * @param employeesBaseDO
     */
     void saveMainBaseEmployees(EmployeesBaseDO employeesBaseDO);

    /**
     * 将明细表插入到主表中
     * @param employeesDetailDO
     */
     void saveMainDetailEmployees(EmployeesDetailDO employeesDetailDO);

    /**
     * 将手机表插入到主表中
     * @param employeesPhoneDO
     */
     void saveMainPhoneEmployees(EmployeesPhoneDO employeesPhoneDO);

    /**
     * 将基础Excel表插入到副表中
     * @param employeesBaseDO
     */
     void saveViceBaseEmployees(EmployeesBaseDO employeesBaseDO);

    /**
     * 将明细表excel插入副表中
     * @param employeesDetailDO
     */
     void saveViceDetailEmployees(EmployeesDetailDO employeesDetailDO);

    /**
     * 将手机号表插入到副表中
     * @param employeesPhoneDO
     */
     void saveVicePhoneEmployees(EmployeesPhoneDO employeesPhoneDO);

    /**
     * 修改主表中的所有字段
     * @param employeesDO
     */
     void updateMainEmployees(EmployeesDO employeesDO);

    /**
     * 修改主表中的base字段
     * @param employeesBaseDO
     */
     void updateMainBaseEmployees(EmployeesBaseDO employeesBaseDO);

    /**
     * 更新主表中明细字段
     * @param employeesDetailDO
     */
     void updateMainDetailEmployees(EmployeesDetailDO employeesDetailDO);

    /**
     * 更新主表中手机号字段
     * @param employeesPhoneDO
     */
     void updateMainPhoneEmployees(EmployeesPhoneDO employeesPhoneDO);

    /**
     * 修改副表中的所有字段
     * @param employeesDO
     */
     void updateViceEmployees(EmployeesDO employeesDO);

    /**
     * 修改副表中base字段
     * @param employeesBaseDO
     */
     void updateViceBaseEmployees(EmployeesBaseDO employeesBaseDO);


    /**
     * 更新副表中明细字段
     * @param employeesDetailDO
     */
     void updateViceDetailEmployees(EmployeesDetailDO employeesDetailDO);

    /**
     * 更新副表中的手机号码字段
     * @param employeesPhoneDO
     */
     void updateVicePhoneEmployees(EmployeesPhoneDO employeesPhoneDO);

    /**
     * 从主表和附表 查询所有信息
     * @return
     */
     List<EmployeesDO> findAllEmp(EmpCondition empCondition);

    /**
     * 通过员工id查询员工
     * @param empCondition
     * @return
     */
     EmployeesDO findEmpById(EmpCondition empCondition);

    /**
     * 通过员工钉钉id查询员工
     * @param empCondition
     * @return
     */
    EmployeesDO findEmpByDingId(EmpCondition empCondition);

    /**
     *  通过工号查询id
     * @param empCondition
     * @return
     */
     Integer findIdByWorkNum(EmpCondition empCondition);

    /**
     *  更具员工id查询副表id
     * @param empCondition
     * @return
     */
     Integer findViceIdById(EmpCondition empCondition);


    /**
     * 删除主表中的员工
     * @param id
     */
     void deleteMainEmp(@Param("id")Integer id);

    /**
     * 删除副表中的员工
     * @param viceId
     */
     void deleteViceEmp(@Param("viceId")Integer viceId);

    /**
     * 根据外包工号查询员工
     * @Param outNum 外包工号
     * @return 返回员工基本信息
     */
     EmployeesDO findEmpByOutNum(@Param("outNum") String outNum);


    /**
     * 根据工号查询员工
     * @Param workNum 工号
     * @return 返回员工基本信息
     */
    EmployeesDO findEmpByWorkNum(@Param("workNum") String workNum);

    /**
     * 根据员工钉钉id,查找人员主键
     */
    Integer findIdByDingId(String userId);

    /**
     * 根据部门查找人员
     */
    List<EmployeesBaseDO> findEmpListByDeptId(@Param("deptId") Long deptId);


    /**
     * 查询在职员工中没有工号的人员
     * @return 人员list列表
     */
    List<EmployeesDO> findDingIdMissEmpList();

    /**
     * 批量删除人员list
     * @param delUserList 工号列表
     */
    void batchDelUsers(@Param("workNumList") List<String> delUserList, @Param("updateTime") Date updateTime);

    /**
     * 根据部门id查询员工信息
     * @param empCondition
     * @return
     */
    List<EmployeesDO> findEmpListByEmpCondition(EmpCondition empCondition);


    List<String> findAllWorkNumList(EmpCondition empCondition);

    String findEmpNameByUserId(String ownerId);

    List<Map<Object,Object>>findEmpIdByWorkNoMap();

    /**
     * 从钉钉获取数据并保持
     * @param employeesDO
     */
    void InsertEmpFromDingding(EmployeesDO employeesDO);

    /**
     * 删除主表中的员工
     * @param dingId
     */
    void deleteMainEmpByDingId(@Param("dingId")String dingId);
}